<template>
    <div class="person">
      <h1>情况一：监视【ref】定义的【基本类型】数据</h1>
      <h2>当前求和为：{{sum}}</h2>
      <button @click="changeSum">点我sum+1</button>
    </div>
    <div class="person">
    <h1>情况二：监视【ref】定义的【对象类型】数据</h1>
    <h2>姓名：{{ person.name }}</h2>
    <h2>年龄：{{ person.age }}</h2>
    <button @click="changeName">修改名字</button>
    <button @click="changeAge">修改年龄</button>
    <button @click="changePerson">修改整个人</button>
  </div>
  <div class="person">
    <h1>情况三：监视【reactive】定义的【对象类型】数据</h1>
    <h2>品牌：{{ car.brand }}</h2>
    <h2>价格：{{ car.price }}</h2>
    <button @click="changeBrand">修改品牌</button>
    <button @click="changePrice">修改价格</button>
    <hr>
    <h2>测试：{{obj.a.b.c}}</h2>
    <button @click="test">修改obj.a.b.c</button>
  </div>
  
  </template>
  
  <script lang="ts" setup name="Person">
    import {ref,reactive,watch} from 'vue'
    // 数据
    let sum = ref(0)
    // 方法
    function changeSum(){
      sum.value += 1
    }
    // 监视，情况一：监视【ref】定义的【基本类型】数据
    const stopWatch = watch(sum,(newValue,oldValue)=>{
      console.log('sum变化了',newValue,oldValue)
      if(newValue >= 10){
        stopWatch()
      }
    })



    // 数据
  let person = ref({
    name:'张三',
    age:18
  })
  // 方法
  function changeName(){
    person.value.name += '~'
  }
  function changeAge(){
    person.value.age += 1
  }
  function changePerson(){
    person.value = {name:'李四',age:90}
  }
  /* 
    监视，情况二：监视【ref】定义的【对象类型】数据，监视的是对象的地址值，若想监视对象内部属性的变化，需要手动开启深度监视
    watch的第一个参数是：被监视的数据
    watch的第二个参数是：监视的回调
    watch的第三个参数是：配置对象（deep、immediate等等.....） 
    也就是说，在不开启deep时，修改对象的属性不会被监视，修改整个对象才会被监视，开启后修改属性也会被监视
  */
  watch(person,(newValue,oldValue)=>{
    console.log('person变化了',newValue,oldValue)
  },{deep:true,immediate:true})



  let car = reactive({ brand:"奔驰",price:100 })
  let obj = reactive({
    a:{
      b:{
        c:666
      }
    }
  })
  function changePrice(){
        car.price += 10
  }
  function changeBrand(){//用reactive不用加.value
        car.brand = '宝马'
  }
  function test(){
    obj.a.b.c = 888
  }
  // 监视，情况三：监视【reactive】定义的【对象类型】数据，且默认是开启深度监视的
  watch(car,(newValue,oldValue)=>{
    console.log('car变化了',newValue,oldValue)
  })
  watch(obj,(newValue,oldValue)=>{
    console.log('Obj变化了',newValue,oldValue)
  })




  
  </script>

<style scoped>
.person{
    background: skyblue;
    box-shadow: 0 0 10px;
    border-radius: 10px;
    padding: 20px;
}
</style>